home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / demos / VisualAge for Java 2.0 Entry / setup / data1.cab / ide-e / IDE / cache / 1MSLOK3 (.txt) < prev    next >
Encoding:
Java Class File  |  1998-09-16  |  10.3 KB  |  389 lines

  1. package com.sun.java.swing;
  2.  
  3. import com.sun.java.accessibility.Accessible;
  4. import com.sun.java.accessibility.AccessibleContext;
  5. import com.sun.java.swing.border.Border;
  6. import com.sun.java.swing.event.ChangeEvent;
  7. import com.sun.java.swing.event.ChangeListener;
  8. import com.sun.java.swing.event.EventListenerList;
  9. import java.awt.Component;
  10. import java.awt.Container;
  11. import java.awt.Dimension;
  12. import java.awt.Graphics;
  13. import java.awt.Image;
  14. import java.awt.Insets;
  15. import java.awt.LayoutManager;
  16. import java.awt.Point;
  17. import java.awt.Rectangle;
  18. import java.awt.event.ComponentListener;
  19.  
  20. public class JViewport extends JComponent implements Accessible {
  21.    protected boolean isViewSizeSet = false;
  22.    protected Point lastPaintPosition = null;
  23.    protected boolean backingStore = false;
  24.    protected transient Image backingStoreImage = null;
  25.    protected boolean scrollUnderway = false;
  26.    private ComponentListener viewListener = null;
  27.    private transient ChangeEvent changeEvent = null;
  28.    static Class class$com$sun$java$swing$event$ChangeListener;
  29.  
  30.    public JViewport() {
  31.       ((Container)this).setLayout(this.createLayoutManager());
  32.    }
  33.  
  34.    public void addChangeListener(ChangeListener l) {
  35.       EventListenerList var10000 = super.listenerList;
  36.       Class var10001 = class$com$sun$java$swing$event$ChangeListener;
  37.       if (var10001 == null) {
  38.          try {
  39.             var10001 = Class.forName("com.sun.java.swing.event.ChangeListener");
  40.          } catch (ClassNotFoundException var2) {
  41.             throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  42.          }
  43.  
  44.          class$com$sun$java$swing$event$ChangeListener = var10001;
  45.       }
  46.  
  47.       var10000.add(var10001, l);
  48.    }
  49.  
  50.    protected void addImpl(Component child, Object constraints, int index) {
  51.       this.setView(child);
  52.    }
  53.  
  54.    protected boolean computeBlit(int dx, int dy, Point blitFrom, Point blitTo, Dimension blitSize, Rectangle blitPaint) {
  55.       int dxAbs = Math.abs(dx);
  56.       int dyAbs = Math.abs(dy);
  57.       Dimension extentSize = this.getExtentSize();
  58.       if (dx == 0 && dy != 0 && dyAbs < extentSize.height) {
  59.          if (dy < 0) {
  60.             blitFrom.y = -dy;
  61.             blitTo.y = 0;
  62.             blitPaint.y = extentSize.height + dy;
  63.          } else {
  64.             blitFrom.y = 0;
  65.             blitTo.y = dy;
  66.             blitPaint.y = 0;
  67.          }
  68.  
  69.          blitPaint.x = blitFrom.x = blitTo.x = 0;
  70.          blitSize.width = extentSize.width;
  71.          blitSize.height = extentSize.height - dyAbs;
  72.          blitPaint.width = extentSize.width;
  73.          blitPaint.height = dyAbs;
  74.          return true;
  75.       } else if (dy == 0 && dx != 0 && dxAbs < extentSize.width) {
  76.          if (dx < 0) {
  77.             blitFrom.x = -dx;
  78.             blitTo.x = 0;
  79.             blitPaint.x = extentSize.width + dx;
  80.          } else {
  81.             blitFrom.x = 0;
  82.             blitTo.x = dx;
  83.             blitPaint.x = 0;
  84.          }
  85.  
  86.          blitPaint.y = blitFrom.y = blitTo.y = 0;
  87.          blitSize.width = extentSize.width - dxAbs;
  88.          blitSize.height = extentSize.height;
  89.          blitPaint.y = 0;
  90.          blitPaint.width = dxAbs;
  91.          blitPaint.height = extentSize.height;
  92.          return true;
  93.       } else {
  94.          return false;
  95.       }
  96.    }
  97.  
  98.    protected LayoutManager createLayoutManager() {
  99.       return new ViewportLayout();
  100.    }
  101.  
  102.    protected ViewListener createViewListener() {
  103.       return new ViewListener(this);
  104.    }
  105.  
  106.    protected void fireStateChanged() {
  107.       Object[] listeners = super.listenerList.getListenerList();
  108.  
  109.       for(int i = listeners.length - 2; i >= 0; i -= 2) {
  110.          Object var10000 = listeners[i];
  111.          Class var10001 = class$com$sun$java$swing$event$ChangeListener;
  112.          if (var10001 == null) {
  113.             try {
  114.                var10001 = Class.forName("com.sun.java.swing.event.ChangeListener");
  115.             } catch (ClassNotFoundException var3) {
  116.                throw new NoClassDefFoundError(((Throwable)var3).getMessage());
  117.             }
  118.  
  119.             class$com$sun$java$swing$event$ChangeListener = var10001;
  120.          }
  121.  
  122.          if (var10000 == var10001) {
  123.             if (this.changeEvent == null) {
  124.                this.changeEvent = new ChangeEvent(this);
  125.             }
  126.  
  127.             ((ChangeListener)listeners[i + 1]).stateChanged(this.changeEvent);
  128.          }
  129.       }
  130.  
  131.    }
  132.  
  133.    public AccessibleContext getAccessibleContext() {
  134.       if (super.accessibleContext == null) {
  135.          super.accessibleContext = new AccessibleJViewport(this);
  136.       }
  137.  
  138.       return super.accessibleContext;
  139.    }
  140.  
  141.    private Graphics getBackingStoreGraphics(Graphics g) {
  142.       Graphics bsg = this.backingStoreImage.getGraphics();
  143.       bsg.setColor(g.getColor());
  144.       bsg.setFont(g.getFont());
  145.       bsg.setClip(g.getClipBounds());
  146.       return bsg;
  147.    }
  148.  
  149.    public Dimension getExtentSize() {
  150.       return ((Component)this).getSize();
  151.    }
  152.  
  153.    public final Insets getInsets() {
  154.       return new Insets(0, 0, 0, 0);
  155.    }
  156.  
  157.    public Component getView() {
  158.       return ((Container)this).getComponentCount() > 0 ? ((Container)this).getComponent(0) : null;
  159.    }
  160.  
  161.    private Point getViewLocation() {
  162.       Component view = this.getView();
  163.       return view != null ? view.getLocation() : new Point(0, 0);
  164.    }
  165.  
  166.    public Point getViewPosition() {
  167.       Component view = this.getView();
  168.       if (view != null) {
  169.          Point p = view.getLocation();
  170.          p.x = -p.x;
  171.          p.y = -p.y;
  172.          return p;
  173.       } else {
  174.          return new Point(0, 0);
  175.       }
  176.    }
  177.  
  178.    public Rectangle getViewRect() {
  179.       return new Rectangle(this.getViewPosition(), this.getExtentSize());
  180.    }
  181.  
  182.    public Dimension getViewSize() {
  183.       Component view = this.getView();
  184.       if (view == null) {
  185.          return new Dimension(0, 0);
  186.       } else {
  187.          return this.isViewSizeSet ? view.getSize() : view.getPreferredSize();
  188.       }
  189.    }
  190.  
  191.    public boolean isBackingStoreEnabled() {
  192.       return this.backingStore;
  193.    }
  194.  
  195.    public boolean isOptimizedDrawingEnabled() {
  196.       return false;
  197.    }
  198.  
  199.    public void paint(Graphics g) {
  200.       int width = ((JComponent)this).getWidth();
  201.       int height = ((JComponent)this).getHeight();
  202.       if (width != 0 && height != 0) {
  203.          if (!this.backingStore) {
  204.             super.paint(g);
  205.             this.lastPaintPosition = this.getViewLocation();
  206.          } else {
  207.             if (this.backingStoreImage == null) {
  208.                this.backingStoreImage = ((Component)this).createImage(width, height);
  209.                this.paintViaBackingStore(g);
  210.             } else if (this.scrollUnderway && !this.lastPaintPosition.equals(this.getViewLocation())) {
  211.                Point blitFrom = new Point();
  212.                Point blitTo = new Point();
  213.                Dimension blitSize = new Dimension();
  214.                Rectangle blitPaint = new Rectangle();
  215.                Point newLocation = this.getViewLocation();
  216.                int dx = newLocation.x - this.lastPaintPosition.x;
  217.                int dy = newLocation.y - this.lastPaintPosition.y;
  218.                boolean canBlit = this.computeBlit(dx, dy, blitFrom, blitTo, blitSize, blitPaint);
  219.                if (!canBlit) {
  220.                   this.paintViaBackingStore(g);
  221.                } else {
  222.                   int bdx = blitTo.x - blitFrom.x;
  223.                   int bdy = blitTo.y - blitFrom.y;
  224.                   Graphics bsg = this.getBackingStoreGraphics(g);
  225.                   bsg.copyArea(blitFrom.x, blitFrom.y, blitSize.width, blitSize.height, bdx, bdy);
  226.                   Rectangle r = this.getView().getBounds().intersection(blitPaint);
  227.                   bsg.setClip(r);
  228.                   super.paint(bsg);
  229.                   g.drawImage(this.backingStoreImage, 0, 0, this);
  230.                }
  231.             } else {
  232.                this.paintViaBackingStore(g);
  233.             }
  234.  
  235.             this.lastPaintPosition = this.getViewLocation();
  236.             this.scrollUnderway = false;
  237.          }
  238.       }
  239.    }
  240.  
  241.    private void paintViaBackingStore(Graphics g) {
  242.       Graphics bsg = this.getBackingStoreGraphics(g);
  243.       super.paint(bsg);
  244.       g.drawImage(this.backingStoreImage, 0, 0, this);
  245.    }
  246.  
  247.    private int positionAdjustment(int parentWidth, int childWidth, int childAt) {
  248.       if (childAt >= 0 && childWidth + childAt <= parentWidth) {
  249.          return 0;
  250.       } else if (childAt <= 0 && childWidth + childAt >= parentWidth) {
  251.          return 0;
  252.       } else if (childAt > 0 && childWidth <= parentWidth) {
  253.          return -childAt + parentWidth - childWidth;
  254.       } else if (childAt >= 0 && childWidth >= parentWidth) {
  255.          return -childAt;
  256.       } else if (childAt <= 0 && childWidth <= parentWidth) {
  257.          return -childAt;
  258.       } else {
  259.          return childAt < 0 && childWidth >= parentWidth ? -childAt + parentWidth - childWidth : 0;
  260.       }
  261.    }
  262.  
  263.    public void remove(Component child) {
  264.       child.removeComponentListener(this.viewListener);
  265.       super.remove(child);
  266.    }
  267.  
  268.    public void removeChangeListener(ChangeListener l) {
  269.       EventListenerList var10000 = super.listenerList;
  270.       Class var10001 = class$com$sun$java$swing$event$ChangeListener;
  271.       if (var10001 == null) {
  272.          try {
  273.             var10001 = Class.forName("com.sun.java.swing.event.ChangeListener");
  274.          } catch (ClassNotFoundException var2) {
  275.             throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  276.          }
  277.  
  278.          class$com$sun$java$swing$event$ChangeListener = var10001;
  279.       }
  280.  
  281.       var10000.remove(var10001, l);
  282.    }
  283.  
  284.    public void repaint(long tm, int x, int y, int w, int h) {
  285.       Container parent = ((Component)this).getParent();
  286.       if (parent != null) {
  287.          ((Component)parent).repaint(tm, x + ((JComponent)this).getX(), y + ((JComponent)this).getY(), w, h);
  288.       } else {
  289.          super.repaint(tm, x, y, w, h);
  290.       }
  291.  
  292.    }
  293.  
  294.    public void scrollRectToVisible(Rectangle contentRect) {
  295.       Component view = this.getView();
  296.       if (view != null) {
  297.          int dx = 0;
  298.          int dy = 0;
  299.          Rectangle bounds = ((Component)this).getBounds();
  300.          dx = this.positionAdjustment(bounds.width, contentRect.width, contentRect.x);
  301.          dy = this.positionAdjustment(bounds.height, contentRect.height, contentRect.y);
  302.          if (dx != 0 || dy != 0) {
  303.             Point viewPosition = this.getViewPosition();
  304.             this.setViewPosition(new Point(viewPosition.x - dx, viewPosition.y - dy));
  305.             this.scrollUnderway = false;
  306.          }
  307.  
  308.       }
  309.    }
  310.  
  311.    public void setBackingStoreEnabled(boolean x) {
  312.       this.backingStore = x;
  313.    }
  314.  
  315.    public final void setBorder(Border border) {
  316.       if (border != null) {
  317.          throw new IllegalArgumentException("JViewport.setBorder() not supported");
  318.       }
  319.    }
  320.  
  321.    public void setBounds(int x, int y, int w, int h) {
  322.       Dimension size = ((Component)this).getSize();
  323.       if (size.width != w || size.height != h) {
  324.          this.backingStoreImage = null;
  325.       }
  326.  
  327.       super.setBounds(x, y, w, h);
  328.    }
  329.  
  330.    public void setExtentSize(Dimension newExtent) {
  331.       Dimension oldExtent = this.getExtentSize();
  332.       if (!newExtent.equals(oldExtent)) {
  333.          ((Component)this).setSize(newExtent);
  334.          this.fireStateChanged();
  335.       }
  336.  
  337.    }
  338.  
  339.    public void setView(Component view) {
  340.       int n = ((Container)this).getComponentCount();
  341.  
  342.       for(int i = n - 1; i >= 0; --i) {
  343.          ((Container)this).remove(i);
  344.       }
  345.  
  346.       this.isViewSizeSet = false;
  347.       if (view != null) {
  348.          super.addImpl(view, (Object)null, -1);
  349.          this.viewListener = this.createViewListener();
  350.          view.addComponentListener(this.viewListener);
  351.       }
  352.  
  353.    }
  354.  
  355.    public void setViewPosition(Point p) {
  356.       Component view = this.getView();
  357.       if (view != null) {
  358.          p = new Point(-p.x, -p.y);
  359.          if (!p.equals(view.getLocation())) {
  360.             this.scrollUnderway = true;
  361.             view.setLocation(p);
  362.             this.fireStateChanged();
  363.          }
  364.       }
  365.  
  366.    }
  367.  
  368.    public void setViewSize(Dimension newSize) {
  369.       Component view = this.getView();
  370.       if (view != null) {
  371.          Dimension oldSize = view.getSize();
  372.          if (!newSize.equals(oldSize)) {
  373.             view.setSize(newSize);
  374.             this.isViewSizeSet = true;
  375.             this.fireStateChanged();
  376.          }
  377.       }
  378.  
  379.    }
  380.  
  381.    public Dimension toViewCoordinates(Dimension size) {
  382.       return new Dimension(size);
  383.    }
  384.  
  385.    public Point toViewCoordinates(Point p) {
  386.       return new Point(p);
  387.    }
  388. }
  389.